package com.nilhcem.bblfr.jobs.splashscreen.checkdata; import android.content.Context; import android.location.Location; import android.util.Pair; import com.nilhcem.bblfr.core.map.LocationProvider; import com.nilhcem.bblfr.core.prefs.Preferences; import com.nilhcem.bblfr.model.baggers.City; import com.nilhcem.bblfr.model.baggers.dao.BaggersDao; import com.nilhcem.bblfr.model.baggers.dao.CitiesDao; import com.nilhcem.bblfr.model.locations.dao.LocationsDao; import java.util.List; import javax.inject.Inject; import rx.Observable; import timber.log.Timber; public class CheckDataService { private final Preferences mPrefs; private final CitiesDao mCitiesDao; private final BaggersDao mBaggersDao; private final LocationsDao mLocationsDao; private final LocationProvider mProvider; @Inject public CheckDataService(Preferences prefs, CitiesDao citiesDao, BaggersDao baggersDao, LocationsDao locationsDao, LocationProvider locationProvider) { mPrefs = prefs; mCitiesDao = citiesDao; mBaggersDao = baggersDao; mLocationsDao = locationsDao; mProvider = locationProvider; } public Observable<Pair<Boolean, City>> checkData(Context context) { return Observable.zip( checkDatabase(), getFavoriteCity(context), Pair::create); } private Observable<Boolean> checkDatabase() { return Observable.fromCallable(() -> mCitiesDao.hasData() && mBaggersDao.hasData() && mLocationsDao.hasData() ); } private Observable<City> getFavoriteCity(Context context) { return Observable.fromCallable(() -> { mProvider.initSync(context); City city = null; Pair<String, String> latLng = mPrefs.getFavoriteCityLatLng(); if (latLng != null) { Timber.d("Favorite city found"); city = mCitiesDao.getCityByLatLng(latLng.first, latLng.second); } if (city == null) { Timber.d("Try to find the closest city"); city = findClosestCity(mProvider.getLastKnownLocation(), mCitiesDao.getCities()); if (city != null) { mPrefs.setFavoriteCity(city); } } return city; }); } City findClosestCity(Location location, List<City> cities) { City closestCity = null; float closestDistance = Float.MAX_VALUE; if (location != null && cities != null) { for (City city : cities) { float[] results = new float[1]; Location.distanceBetween(city.lat, city.lng, location.getLatitude(), location.getLongitude(), results); if (results[0] < closestDistance) { closestCity = city; closestDistance = results[0]; } } } return closestCity; } }